package cliente;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import utilidad.SocketManager;
import excepciones.VariableEnEstadoOFFException;
import excepciones.VariableEnEstadoONException;
import excepciones.VariableOFFNoExisteException;
import excepciones.VariableONNoExisteException;

public class PanelListado extends JPanel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public JTable tabla;
	public ModeloTabla dtm;
	private JPopupMenu jPMmenu;
	private JPanel este;
	private SocketManager sm;

	/**
	 * Create the panel.
	 */
	@SuppressWarnings("serial")
	public PanelListado(final SocketManager sm) {
		este=this;
		this.sm=sm;

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setPreferredSize((new Dimension(600,350)));
		this.add(scrollPane, "1, 2, fill, fill");



		//		tabla = new JTable();
		//		scrollPane.setViewportView(tabla);


		String[] columnas = {"Placa ID", "Variable", "Estado", "�ltima acci�n"};
		ArrayList <String> lineastemp = new ArrayList<String>();
		int numLineas = 0;
		boolean nofin=false;
		try {
			sm.Escribir("LISTADO"+'\n');
			//String sentenciaRecibida = sm.Leer();
			while(!nofin)
			{
				String temporal=sm.Leer();
				System.out.println("ESTE ESSS"+temporal);
				if(temporal.equals("202 FINLISTA"))
				{
					nofin=true;
				}
				else
				{
					numLineas++;
					lineastemp.add(temporal);
				}
			}
			System.out.println(lineastemp.size());
			/*System.out.println("Inicio lineas");
			for(int i=0; i<lineas.length; i++)
			{
				System.out.println(lineas[i]);
			}
			System.out.println("Final lineas");*/
			//sentenciaRecibida=sentenciaRecibida.substring(0, sentenciaRecibida.indexOf(""\n"));

			/*System.out.println(ultima);
	        System.out.println(estado);
	        System.out.println(funcion);
	        System.out.println(id_variable);*/

		} catch (IOException e2) {
			// TODO Auto-generated catch block
			e2.printStackTrace();
		}

		String[][] datos = new String[numLineas][4];

		if(lineastemp!=null)
		{
			for (int i = 0; i < lineastemp.size(); i++) 
			{
				String cortado=lineastemp.get(i).substring(8);
				StringTokenizer tokenb=new StringTokenizer(cortado);
				String id_placa=tokenb.nextToken(";");
				String id_variable=tokenb.nextToken(";").trim();
				String funcion=tokenb.nextToken(";");
				funcion=funcion.substring(1);
				String estado=tokenb.nextToken(";");
				estado=estado.substring(1);
				String ultima=tokenb.nextToken();
				ultima=ultima.substring(1);


				//inserto los datos
				datos[i][0] = id_placa;
				datos[i][1] = id_variable;
				datos[i][2] = estado;
				datos[i][3] = ultima;

			}
		}




		tabla = new JTable();
		tabla.setGridColor(new Color(0, 0, 0));
		tabla.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
		tabla.setPreferredSize(new Dimension(600,350));
		tabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tabla.setFont(new Font("Tahoma", Font.ROMAN_BASELINE, 16));
		scrollPane.setViewportView(tabla);


		DefaultTableCellRenderer tcr = new DefaultTableCellRenderer();
		tcr.setHorizontalAlignment(SwingConstants.CENTER);
		
		dtm = new ModeloTabla(datos, columnas);
		tabla.setModel(dtm);
		for(int i = 0;i < 4; i ++ ){
		
			tabla.getColumnModel().getColumn(i).setCellRenderer(tcr);
		}
		tabla.getColumnModel().getColumn(0).setPreferredWidth(20);
		tabla.getColumnModel().getColumn(1).setPreferredWidth(80);
		tabla.getColumnModel().getColumn(2).setPreferredWidth(20);
		tabla.getColumnModel().getColumn(3).setPreferredWidth(180);
		
		
		tabla.setEnabled(true);

	

		//		int ancho = tabla.getWidth();


		jPMmenu= new JPopupMenu();
		JMenuItem activar= new JMenuItem("Activar");
		JMenuItem desactivar= new JMenuItem("Desactivar");

		jPMmenu.add(activar);
		jPMmenu.add(desactivar);


		//escuchadores

		activar.addMouseListener(new MouseAdapter() {

			public void mouseReleased(MouseEvent e) {
				//Aqui hay que hacer la funcionalidad para cambiar de estado.
				String id_placa=(String) dtm.getValueAt(tabla.getSelectedRow(), 0);
				String id_variable=(String) dtm.getValueAt(tabla.getSelectedRow(), 1);
				String sentenciaAEnviar = "ON " + id_placa+" "+id_variable;
				System.out.println("Sentencia enviada:" + sentenciaAEnviar);
				String sentenciaRecibida="";
				try {
					sm.Escribir(sentenciaAEnviar + '\n');
					sentenciaRecibida = sm.Leer();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				System.out.println(sentenciaRecibida);
				StringTokenizer token = new StringTokenizer(sentenciaRecibida);
				String codigoError = token.nextToken();
				if(codigoError.equals("403"))
				{
					try {
						throw new VariableONNoExisteException();
					} catch (VariableONNoExisteException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
				else if(codigoError.equals("404"))
				{
					try {
						throw new VariableEnEstadoONException();
					} catch (VariableEnEstadoONException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
				else if(codigoError.equals("203"))
				{
					JOptionPane.showMessageDialog(null, "203 OK Control de "+id_variable+" activo.", "¡Listo!", JOptionPane.INFORMATION_MESSAGE);
					dtm.setValueAt("ON", tabla.getSelectedRow(), 2);
					tabla.repaint();
				}

			}

		});
		desactivar.addMouseListener(new MouseAdapter() {

			public void mouseReleased(MouseEvent e) {
				//Aqui hay que hacer la funcionalidad para cambiar de estado.
				String id_placa=(String) dtm.getValueAt(tabla.getSelectedRow(), 0);
				String id_variable=(String) dtm.getValueAt(tabla.getSelectedRow(), 1);
				String sentenciaAEnviar = "OFF " + id_placa+" "+id_variable;
				System.out.println("Sentencia enviada:" + sentenciaAEnviar);
				String sentenciaRecibida="";
				try {
					sm.Escribir(sentenciaAEnviar + '\n');
					sentenciaRecibida = sm.Leer();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				System.out.println(sentenciaRecibida);
				StringTokenizer token = new StringTokenizer(sentenciaRecibida);
				String codigoError = token.nextToken();
				if(codigoError.equals("405"))
				{
					try {
						throw new VariableOFFNoExisteException();
					} catch (VariableOFFNoExisteException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
				else if(codigoError.equals("406"))
				{
					try {
						throw new VariableEnEstadoOFFException();
					} catch (VariableEnEstadoOFFException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
				else if(codigoError.equals("204"))
				{
					JOptionPane.showMessageDialog(null, "204 OK Control de "+id_variable+" desactivado.", "¡Listo!", JOptionPane.INFORMATION_MESSAGE);
					dtm.setValueAt("OFF", tabla.getSelectedRow(), 2);
					tabla.repaint();
				}

			}

		});



		tabla.addMouseListener(new MouseAdapter() {

			public void mousePressed(MouseEvent e){
				if(e.isPopupTrigger())
				{
					jPMmenu.show(este,e.getX(),e.getY());	
				}
				if(tabla.getSelectedRow()!=-1)
				{
					VentanaPrincipal.btnActuar.setEnabled(true);
					VentanaPrincipal.btnObtenerFoto.setEnabled(true);
				}

			}

			public void mouseReleased(MouseEvent e)
			{
				if(e.isPopupTrigger())
				{
					jPMmenu.show(este,e.getX(),e.getY());	
				}
			}
		});

	}
	
	public void modificarAccion(String eleccionFinal)
	{
		dtm.setValueAt(eleccionFinal, tabla.getSelectedRow(), 3);
		tabla.repaint();
		
	}

	
	public class ModeloTabla extends DefaultTableModel{

		
		public ModeloTabla() {
			super();
			// TODO Auto-generated constructor stub
		}

		public ModeloTabla(Object[][] data, Object[] columnNames) {
			super(data, columnNames);
			// TODO Auto-generated constructor stub
		}

		private static final long serialVersionUID = 1L;
		
		public boolean isCellEditable(int fila,int columna){
			if(columna >= 0)
				return false;
			return true;
		}
		
	}
}
